CloudWatch Logsの機密情報保護の監査結果を確認する #reinvent
Amazon CloudWatch Logsで、機密情報を保護できるようになりました。
この機密情報の保護は、監査結果を3つのルートで送信できます。
- CloudWatch Logs -> CloudWatch Logs
- CloudWatch Logs -> S3
- CloudWatch Logs -> Firehose
本記事では、どのような監査結果になるのか?を確認してみました。
おすすめの方
- Amazon CloudWatch Logsのデータ保護機能をCloudFormationで利用したい方
- Amazon CloudWatch Logsのデータ保護機能の監査結果の内容を知りたい方
CloudFormationテンプレート
メールアドレスを機密情報としています。他の機密情報の内容や設定すべきARNは、次のドキュメントをご覧ください。
AWSTemplateFormatVersion: '2010-09-09' Parameters: LambdaLogGroupNamePrefix: Type: String Default: /aws/lambda Resources: # 機密情報を保護する対象のロググループ TestLogGroup: Type: AWS::Logs::LogGroup Properties: LogGroupName: !Sub ${LambdaLogGroupNamePrefix}/test-2022-12-aaa DataProtectionPolicy: Name: test-2022-12-aaa-data-protection-policy Version: 2021-06-01 Statement: - DataIdentifier: - arn:aws:dataprotection::aws:data-identifier/EmailAddress Operation: Audit: FindingsDestination: CloudWatchLogs: LogGroup: !Ref AuditLogGroup Firehose: DeliveryStream: !Ref CloudWatchLogsAuditFirehose S3: Bucket: !Ref CloudWatchLogsAuditBucket - DataIdentifier: - arn:aws:dataprotection::aws:data-identifier/EmailAddress Operation: Deidentify: MaskConfig: {} # 監査結果を保持するロググループ AuditLogGroup: Type: AWS::Logs::LogGroup Properties: LogGroupName: !Sub ${LambdaLogGroupNamePrefix}/test-2022-12-audit # 監査結果を保持するS3バケット CloudWatchLogsAuditBucket: Type: AWS::S3::Bucket Properties: BucketName: !Sub cloudwatch-logs-audit-${AWS::AccountId}-${AWS::Region} PublicAccessBlockConfiguration: BlockPublicAcls: true BlockPublicPolicy: true IgnorePublicAcls: true RestrictPublicBuckets: true # 監査結果を受け取るFirehose CloudWatchLogsAuditFirehose: Type: AWS::KinesisFirehose::DeliveryStream Properties: DeliveryStreamName: cloudwatch-logs-audit-delivery-stream DeliveryStreamType: DirectPut S3DestinationConfiguration: BucketARN: !GetAtt CloudWatchLogsAuditBucket.Arn Prefix: CloudWatchLogs-DeliveryStream-Prefix/ BufferingHints: SizeInMBs: 50 IntervalInSeconds: 60 CompressionFormat: GZIP RoleARN: !GetAtt CloudWatchLogsAuditFirehoseRole.Arn # Firehose用のIAMロール CloudWatchLogsAuditFirehoseRole: Type: AWS::IAM::Role Properties: RoleName: cloudwatch-logs-audit-delivery-stream-role AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Action: sts:AssumeRole Effect: Allow Principal: Service: firehose.amazonaws.com Policies: - PolicyName: cloudwatch-logs-audit-delivery-stream-policy PolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Action: - s3:AbortMultipartUpload - s3:GetBucketLocation - s3:GetObject - s3:ListBucket - s3:ListBucketMultipartUploads - s3:PutObject Resource: !Sub 'arn:aws:s3:::${CloudWatchLogsAuditBucket}/*'
デプロイ
aws cloudformation deploy \ --template-file logs.yaml \ --stack-name CloudWatch-Data-Protection-audit-Test-Stack \ --capabilities CAPABILITY_NAMED_IAM \ --no-fail-on-empty-changeset
メールアドレスをロググループに送信する
作成したロググループに適当なログストリームを作成し、テスト用のログイベントを送信します。
- メールアドレスのみ
- メールアドレス以外とメールアドレスの混在
- メールアドレスなし
- 複数のメールアドレス
いくつかのログイベントを送信しました。メールアドレスがマスク表示されました。
CloudWatch Logsの機密情報保護の監査結果を確認する
CloudWatch Logsに送信された監査結果
監査結果が保存されるCloudWatch Logsのログは次のようになっていました。 機密情報に該当したログについて、機密情報の種類・出現個数・出現位置が残るようです。
{ "auditTimestamp": "2022-12-07T02:38:17Z", "resourceArn": "arn:aws:logs:ap-northeast-1:xxxxyyyyzzzz:log-group:/aws/lambda/test-2022-12-aaa:*", "dataIdentifiers": [ { "name": "EmailAddress", "count": 1, "detections": [ { "start": 0, "end": 15 } ] } ] }
{ "auditTimestamp": "2022-12-07T02:38:38Z", "resourceArn": "arn:aws:logs:ap-northeast-1:xxxxyyyyzzzz:log-group:/aws/lambda/test-2022-12-aaa:*", "dataIdentifiers": [ { "name": "EmailAddress", "count": 1, "detections": [ { "start": 7, "end": 24 } ] } ] }
{ "auditTimestamp": "2022-12-07T02:43:29Z", "resourceArn": "arn:aws:logs:ap-northeast-1:xxxxyyyyzzzz:log-group:/aws/lambda/test-2022-12-aaa:*", "dataIdentifiers": [ { "name": "EmailAddress", "count": 2, "detections": [ { "start": 8, "end": 22 }, { "start": 25, "end": 39 } ] } ] }
S3バケットに送信された監査結果
S3バケットの中身(直下)は次のようになっていました。
CloudWatch Logs -> S3バケットの場合
オブジェクトは次のように保存されていました。
- AWSLogs/xxxxyyyyzzzz/AuditLogs/logs/ap-northeast-1//aws/lambda/test-2022-12-aaa/2022/12/07/findings/20221207T0240Z_28e94d64.log.gz
- AWSLogs/xxxxyyyyzzzz/AuditLogs/logs/ap-northeast-1//aws/lambda/test-2022-12-aaa/2022/12/07/findings/20221207T0235Z_f362c706.log.gz
S3 Selectで中身を確認してみました。同じです。
{ "auditTimestamp": "2022-12-07T02:38:17Z", "resourceArn": "arn:aws:logs:ap-northeast-1:xxxxyyyyzzzz:log-group:/aws/lambda/test-2022-12-aaa:*", "dataIdentifiers": [ { "name": "EmailAddress", "count": 1, "detections": [ { "start": 0, "end": 15 } ] } ] } { "auditTimestamp": "2022-12-07T02:38:38Z", "resourceArn": "arn:aws:logs:ap-northeast-1:xxxxyyyyzzzz:log-group:/aws/lambda/test-2022-12-aaa:*", "dataIdentifiers": [ { "name": "EmailAddress", "count": 1, "detections": [ { "start": 7, "end": 24 } ] } ] }
{ "auditTimestamp": "2022-12-07T02:43:29Z", "resourceArn": "arn:aws:logs:ap-northeast-1:xxxxyyyyzzzz:log-group:/aws/lambda/test-2022-12-aaa:*", "dataIdentifiers": [ { "name": "EmailAddress", "count": 2, "detections": [ { "start": 8, "end": 22 }, { "start": 25, "end": 39 } ] } ] }
CloudWatch Logs -> Firehose-> S3バケットの場合
オブジェクトは次のように保存されていました。
- CloudWatchLogs-DeliveryStream-Prefix/2022/12/07/02/cloudwatch-logs-audit-delivery-stream-1-2022-12-07-02-38-28-5690a456-b4a0-4f2c-a3e1-e24f7cba0d15.gz
- CloudWatchLogs-DeliveryStream-Prefix/2022/12/07/02/cloudwatch-logs-audit-delivery-stream-1-2022-12-07-02-43-37-96add8c2-ade6-4198-8713-7126e973bc9a.gz
S3 Selectで中身を確認してみました。同じです。
{ "auditTimestamp": "2022-12-07T02:38:17Z", "resourceArn": "arn:aws:logs:ap-northeast-1:xxxxyyyyzzzz:log-group:/aws/lambda/test-2022-12-aaa:*", "dataIdentifiers": [ { "name": "EmailAddress", "count": 1, "detections": [ { "start": 0, "end": 15 } ] } ] } { "auditTimestamp": "2022-12-07T02:38:38Z", "resourceArn": "arn:aws:logs:ap-northeast-1:xxxxyyyyzzzz:log-group:/aws/lambda/test-2022-12-aaa:*", "dataIdentifiers": [ { "name": "EmailAddress", "count": 1, "detections": [ { "start": 7, "end": 24 } ] } ] }
{ "auditTimestamp": "2022-12-07T02:43:29Z", "resourceArn": "arn:aws:logs:ap-northeast-1:xxxxyyyyzzzz:log-group:/aws/lambda/test-2022-12-aaa:*", "dataIdentifiers": [ { "name": "EmailAddress", "count": 2, "detections": [ { "start": 8, "end": 22 }, { "start": 25, "end": 39 } ] } ] }
さいごに
監査結果の送信ルートが異なっても、監査結果の内容は同じでした。 監査機能を使えば、「ログに残るはずのない情報(メールアドレスや住所など)が残ったとき」に通知する仕組みなども実現できそうです。
参考
- [アップデート]Amazon CloudWatch Logsでログデータに含まれた機密情報を保護出来るようになりました #reinvent | DevelopersIO
- CloudWatch Logsの機密情報保護をCloudFormationで設定する #reinvent | DevelopersIO
- AWS::Logs::LogGroup - AWS CloudFormation
- Types of data that you can protect - Amazon CloudWatch Logs
- Personally identifiable information (PII) - Amazon CloudWatch Logs